package com.example.demo.service.impl;

import com.example.demo.service.PublicService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Logger;

import static com.example.demo.common.enums.CommonEnum.DATETIME_FORMATTER;
import static com.example.demo.util.YunOxTools.getTime;


@Service
public class PublicServiceImpl implements PublicService {

    private static final Logger LOGGER = Logger.getLogger(PublicServiceImpl.class.getName());

    @Value("${file.image.address}")
    private String imageAddress;

    @Override
    public String uploadPic(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            throw new IllegalArgumentException("文件不能为空");
        }

        String originalFileName = file.getOriginalFilename();
        // 获取文件扩展名并转化为小写
        String fileExtension = getFileExtension(originalFileName);

        // 检查文件格式是否合法 (目前只支持图片格式)
        if (!isValidImageExtension(fileExtension)) {
            throw new IllegalArgumentException("不支持的文件类型：" + fileExtension);
        }

        // 生成唯一文件名，统一保存为 PNG 格式
        String uniqueFileName = getTime(DATETIME_FORMATTER) + ".png";

        // 获取文件保存路径并确保目录存在
        Path savePath = Paths.get(imageAddress);
        createDirectoryIfNotExists(savePath);

        // 创建目标文件路径
        File targetFile = new File(savePath.toFile(), uniqueFileName);

        try {
            // 尝试将上传的文件读取为图片并保存
            BufferedImage image = ImageIO.read(file.getInputStream());
            if (image == null) {
                throw new IOException("上传的文件不是有效的图片格式");
            }

            // 保存为 PNG 格式
            ImageIO.write(image, "PNG", targetFile);
            LOGGER.info("图片上传成功，保存路径：" + targetFile.getAbsolutePath());

        } catch (IOException e) {
            LOGGER.severe("上传图片时发生错误：" + e.getMessage());
            throw new RuntimeException("图片上传失败", e);
        }

        // 返回文件的绝对路径
        return targetFile.getAbsolutePath();
    }

    // 获取文件扩展名
    private String getFileExtension(String fileName) {
        return fileName != null && fileName.lastIndexOf(".") > 0
                ? fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase()
                : "";
    }

    // 校验是否为合法的图片扩展名
    private boolean isValidImageExtension(String extension) {
        return "jpg".equals(extension) || "jpeg".equals(extension) || "png".equals(extension) || "gif".equals(extension);
    }

    // 创建目录（如果不存在的话）
    private void createDirectoryIfNotExists(Path path) {
        if (!Files.exists(path)) {
            try {
                Files.createDirectories(path);  // 创建多级目录
                LOGGER.info("创建了保存文件的目录：" + path.toString());
            } catch (IOException e) {
                LOGGER.severe("创建目录失败：" + e.getMessage());
                throw new RuntimeException("无法创建文件目录", e);
            }
        }
    }
}
